package com.jason.rxjavatest;

import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

import rx.Observable;
import rx.Scheduler;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;

/**
 * @Author: Jason
 * @Date: 16/5/11
 * @Time: 16:17
 */

public class RxJavaTest03 extends AppCompatActivity {

    private static final String TAG = RxJavaTest03.class.getSimpleName();
    private String url = "http://www.hao123.com";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rxjava3);

        findViewById(R.id.btn3).setOnClickListener(v ->
                startActivity(new Intent(RxJavaTest03.this, RxJavaTest04.class)));


        Observable.just("hello rxjava")
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {
                        Log.e(TAG, "---onCompleted----");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "---onError----");
                    }

                    @Override
                    public void onNext(String s) {
                        Log.e(TAG, "---onNext----");
                    }
                });


        /**
         * 使用subscribeOn()指定观察者代码运行的线程，使用observerOn()指定订阅者运行的线程
         * 任何在我的Subscriber前面执行的代码都是在I/O线程中运行。最后，操作view的代码在主线程中运行.
         * 可以把subscribeOn()和observerOn()添加到任何Observable对象上。这两个也是操作符！。
         * 我不需要关心Observable对象以及它上面有哪些操作符。仅仅运用这两个操作符就可以实现在不同的线程中调度
         *
         */
        Observable.just(url)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {

                    }
                });


        /**
         * 当调用Observable.subscribe()，会返回一个Subscription对象。这个对象代表了被观察者和订阅者之间的联系
         * RxJava的另外一个好处就是它处理unsubscribing的时候，会停止整个调用链。如果你使用了一串很复杂的操作符，
         * 调用unsubscribe将会在他当前执行的地方终止。不需要做任何额外的工作！
         */
        // 订阅 Subscriptions
        Subscription subscription = Observable.just("Hello RxJava!")
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.e(TAG, "----s----" + s);
                    }
                });

        subscription.unsubscribe();
        Log.e(TAG,"subscription----->" + subscription.isUnsubscribed());

    }

    public Observable<String> potentialException(Exception s) {

        return Observable.just(s.toString());
    }
}
